import threading

import serial
import time


class WaterPumpController:
    def __init__(self, port='COM8', baudrate=115200, timeout=1):

        self.lock = threading.Lock()  # 新增锁对象
        """
        初始化串口连接。

        :param port: 串口名称，如 'COM3' 或 '/dev/ttyUSB0'
        :param baudrate: 波特率，默认9600
        :param timeout: 超时时间，默认1秒
        """
        try:
            self.ser = serial.Serial(port, baudrate, timeout=timeout)
            print(f"喂水 成功连接到串口 {port}，波特率 {baudrate}")
        except serial.SerialException as e:
            print(f"喂水 无法打开串口 {port}：{e}")
            self.ser = None

    def open_pump(self):
        """
        发送打开水泵的命令（55 09）。
        """
        if not self.ser or not self.ser.is_open:
            print("喂水 串口未打开，无法发送命令。")
            return

        command = bytes([0x55, 0x09])
        with self.lock:
            self.ser.write(command)
            print(f"已发送打开水泵命令：{command.hex()}")

    def close_pump(self):
        command = bytes([0x55, 0x10])
        if self.ser and self.ser.is_open:
            with self.lock:
                bytes_written = self.ser.write(command)
                self.ser.flush()
                if bytes_written == len(command):
                    print(f"已发送关闭水泵命令：{command.hex()}")

    def activate_pump(self):
        """激活水泵：开启后等待设定时间再关闭"""
        if not self.ser or not self.ser.is_open:
            print("警告", "串口未连接。请先测试连接。")
            return

        try:
            interval_ms = int(500)
            if interval_ms <= 0:
                raise ValueError
        except ValueError:
            print("错误", "请输入一个有效的正整数作为时间间隔。")
            return

        threading.Thread(target=self.run_pump, args=(interval_ms,)).start()

    def run_pump(self, interval_ms):
        """运行水泵：开启后等待指定时间再关闭"""
        try:
            # 发送打开水泵命令（55 09）
            open_command = bytes([0x55, 0x09])
            self.ser.write(open_command)
            self.ser.flush()
            print("已发送打开水泵命令：55 09")

            # 等待指定时间
            time.sleep(interval_ms / 1000.0)

            # 发送关闭水泵命令（55 10）
            if self.ser and self.ser.is_open:
                print("串口开放，准备关闭水阀")
                close_command = bytes([0x55, 0x10])
                with self.lock:
                    self.ser.write(close_command)
                    self.ser.flush()
                    print("已发送关闭水泵命令：55 10")
        except serial.SerialException as e:
            print("错误", f"发送命令失败：{e}")

    def close_serial(self):
        """
        关闭串口连接。
        """
        if self.ser and self.ser.is_open:
            self.ser.close()
            print("串口已关闭。")


if __name__ == "__main__":

    controller = WaterPumpController()
    for i in range(200):
        controller.open_pump()
        time.sleep(1)
        controller.close_pump()
        time.sleep(1)
